home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 071-080 / amok71 / imagemaker / imagemaker.c < prev    next >
C/C++ Source or Header  |  1993-11-04  |  4KB  |  191 lines

  1. /*
  2. *
  3. *   ImageMaker for OBERON   written jul-91 by Matthias Scherrer
  4. *
  5. *   usage: ImageMaker brushname
  6. *
  7. *   brushname: a brush-file (DPaint)            
  8. *
  9. *
  10. */
  11.  
  12. #include <stdio.h>
  13. #include <exec/types.h>
  14. #include <exec/memory.h>
  15. extern void *AllocMem();
  16.  
  17. struct BMHD
  18. {
  19.   UWORD Width,Height;
  20.   WORD  LeftEdge,TopEdge;
  21.   UBYTE Depth;
  22.   UBYTE Mask;
  23.   UBYTE Compression;
  24.   UBYTE pad1;
  25.   UWORD transparentColor;
  26.   UBYTE xAspect,yAspect;
  27.   WORD  pageWidth,pageHeight;
  28. } BMHeader;
  29.  
  30. struct Image
  31. {
  32.   SHORT LeftEdge,TopEdge;
  33.   SHORT Width,Height,Depth;
  34.   SHORT *ImageData;
  35.   UBYTE PlanePick,PlaneOnOff;
  36.   struct Image *NextImage;
  37. } Brush;
  38.  
  39.  BYTE imagename[40],imagefile[40];
  40.  UBYTE *imagedata=0;
  41.  UWORD *data;
  42.  WORD sp;
  43.  LONG i,j;
  44.  ULONG mem;
  45.  FILE *fp;
  46.  
  47. main (argc,argv)
  48.  SHORT argc;
  49.  BYTE *argv[];
  50. {
  51.   SHORT x,y,z;
  52.  
  53.   if(argc<2 || argc>2 || *argv[1]=='?')
  54.     exit(
  55.    puts("Usage: ImageMaker <brushname>"));
  56.  
  57.   if(!strcmp(argv[1],"-s")) argv[1]=argv[2];
  58.  
  59.   for(i=strlen(argv[1])-1;i>=0;i--)
  60.     if(*(argv[1]+i)==':' || *(argv[1]+i)=='/') break;
  61.   sprintf(imagename,"%s",argv[1]+i+1);
  62.  
  63.   printf("Loading Brush %s...",argv[1]);
  64.   LoadBrush(argv[1]);
  65.   Brush.ImageData=(SHORT *)imagedata;
  66.   Brush.Width=BMHeader.Width;
  67.   Brush.Height=BMHeader.Height;
  68.   Brush.Depth=BMHeader.Depth;
  69.   Brush.PlanePick=(1<<BMHeader.Depth)-1;
  70.  
  71.   data=(UWORD *)imagedata;
  72.   x=Brush.Width/16+(Brush.Width%16>0);
  73.   y=Brush.Height;
  74.   z=Brush.Depth;
  75.  
  76.  
  77.   printf("\n\nConverting to file %s.mod\n\n",&imagename[0]);
  78.  
  79.   sprintf(imagefile,"%s.mod",argv[1]);
  80.   if(!(fp=fopen(imagefile,"w")))
  81.   exit(printf("Can't open file '%s' for write.\n",argv[2]));
  82.  
  83.     fprintf(fp,"MODULE XYZ;\n");
  84.     fprintf(fp,"\nIMPORT s:SYSTEM, i:Intuition;\n");
  85.     fprintf(fp,"\n(* $DataChip+ *)\n");
  86.     fprintf(fp,"\n(* Image: %d*%d*%d (Width,Height,Depth)  *)\n",
  87.                 Brush.Width,Brush.Height,Brush.Depth);
  88.     fprintf(fp,"\nTYPE %sArr = ARRAY %d OF INTEGER;\n",imagename,
  89.                  ((Brush.Width+15)/16)*Brush.Height*Brush.Depth);
  90.     fprintf(fp,"\n");
  91.     fprintf(fp,"\nCONST %s = %sArr(\n",imagename,imagename);
  92.     
  93.     for(j=0;j<z;j++)
  94.     {
  95.       for(i=0;i<x*y;i++)
  96.       {
  97.         fprintf(fp,"\n");
  98.         sp=data[i+j*x*y];
  99.         fprintf(fp,"    %7d,",sp); 
  100.         sp=data[++i+j*x*y];
  101.         fprintf(fp," %7d",sp);
  102.         if(i+1<x*y) fprintf(fp,",");
  103.       }
  104.       if (j+1<z) fprintf(fp,",\n");
  105.     }  
  106.     fprintf(fp,");\n\n");
  107.     fprintf(fp,"VAR  %sAdr* : i.ImagePtr;\n",imagename);
  108.     fprintf(fp,"\nBEGIN\n");
  109.     fprintf(fp,"  %sAdr:=s.ADR(%s);\n",imagename,imagename);
  110.     fprintf(fp,"END XYZ.\n\n");
  111.   
  112.   fclose(fp);
  113.   FreeMem(imagedata,mem);
  114.   }
  115.  
  116. LoadBrush(name)
  117. char *name;
  118. {
  119.   BYTE  c2;
  120.   UBYTE *ptr;
  121.   SHORT c,ct,ct2;
  122.   UWORD BWidth,BHeight,BDepth;
  123.  
  124.   if(!(fp=fopen(name,"r")))
  125.     exit(printf("Can't read '%s'.\n",name));
  126.  
  127.   if(!SearchHeader(fp,"ILBMBMHD"))
  128.     exit(fclose(fp),printf("Not an IFF-File.\n"));
  129.  
  130.   ptr=(UBYTE *)&BMHeader;
  131.   for(i=0;i<20;i++) *(ptr++)=getc(fp);
  132.   BWidth=((BMHeader.Width+15)/16)*2;
  133.  
  134.   if(!(imagedata=AllocMem(mem=(ULONG)
  135.     (BWidth*BMHeader.Height*BMHeader.Depth),MEMF_CHIP)))
  136.        exit(fclose(fp),printf("Not enough CHIP-RAM!\n"));
  137.  
  138.   if(!SearchHeader(fp,"BODY"))
  139.      exit(fclose(fp),
  140.      FreeMem(imagedata,mem),
  141.      printf("Not an IFF-File.\n"));
  142.  
  143.   for(BHeight=0;BHeight<BMHeader.Height;BHeight++)
  144.   {
  145.     for(BDepth=0;BDepth<BMHeader.Depth;BDepth++)
  146.     {
  147.       ptr=imagedata+BDepth*BWidth*BMHeader.Height+BHeight*BWidth;
  148.       ct2=0;
  149.       if(!BMHeader.Compression)
  150.         while(ct2++<BWidth) *ptr++=getc(fp);
  151.       else
  152.       {
  153.         while(ct2<BWidth)
  154.         {
  155.           c=getc(fp);
  156.           if(c<=128)
  157.           {
  158.             ct=c+1;
  159.             for(i=0;i<ct;i++){ *ptr++=getc(fp); ct2++; }
  160.           }
  161.           else
  162.           {
  163.             ct=256-c+1;
  164.             c2=getc(fp);
  165.             for(i=0;i<ct;i++){ *ptr++=c2; ct2++; }
  166.           }
  167.         }
  168.       }
  169.     }
  170.   }
  171.   fclose(fp);
  172. }
  173.  
  174. SearchHeader(fp,iffheader)
  175. FILE  *fp;
  176. UBYTE *iffheader;
  177. {
  178.   SHORT c;
  179.   UBYTE *cp=iffheader;
  180.  
  181.   while((c=getc(fp))!=EOF)
  182.   {
  183.     if(c==*cp){cp++;if(!*cp) break; }
  184.     else cp=iffheader;
  185.   }
  186.   if (c==EOF) return(0);
  187.   else { for(i=0;i<4;i++) getc(fp); return(1); }
  188. }
  189.  
  190.        
  191.